#ifndef _MCU_GPIO_H_
#define _MCU_GPIO_H_

#include "mcu.h"

#if (((GPIO_INT0_EDG << 0) \
    | (GPIO_INT1_EDG << 2)\
    | (GPIO_EN_INT0 << 4) \
    | (GPIO_EN_INT1 << 5)) != 0x05)
#define Gpio_INT_Init() \
{   \
    INTEDG = (GPIO_INT0_EDG << 0) \
        | (GPIO_INT1_EDG << 2)\
        | (GPIO_EN_INT0 << 4) \
        | (GPIO_EN_INT1 << 5);\
}
#else
#define Gpio_INT_Init()
#endif
/*
// GPIO寄存器较多，有些不用的功能只需要默认值
#define Gpio_Init() \
{\
    PORTA = GPIO_PA_OUT_VALUE;\
    PORTB = GPIO_PB_OUT_VALUE & 0x3F;\
    BPHCON = (GPIO_PB0_PU << 0)\
        | (GPIO_PB1_PU << 1)\
        | (GPIO_PB2_PU << 2)\
        | (GPIO_PB3_PU << 3)\
        | (GPIO_PB4_PU << 4)\
        | (GPIO_PB5_PU << 5);\
    ABPLCON = (GPIO_PA0_PD << 0)\
        | (GPIO_PA1_PD << 1)\
        | (GPIO_PA2_PD << 2)\
        | (GPIO_PA3_PD << 3)\
        | (GPIO_PB0_PD << 4)\
        | (GPIO_PB1_PD << 5)\
        | (GPIO_PB2_PD << 6)\
        | (GPIO_PB3_PD << 7);\
    AWUCON = GPIO_PA_IC;\
    BWUCON = GPIO_PB_IC;\
    Gpio_INT_Init();\
    IOSTA = GPIO_PA_DIR;\
    IOSTB = GPIO_PB_DIR;\
    APHCON = (GPIO_PA0_PU << 0)\
        | (GPIO_PA1_PU << 1)\
        | (GPIO_PA2_PU << 2)\
        | (GPIO_PA3_PU << 3)\
        | (GPIO_PA4_PU << 4)\
        | (GPIO_PA5_PD << 5)\
        | (GPIO_PA6_PU << 6)\
        | (GPIO_PA7_PU << 7);\
    BODCON = (GPIO_PB0_OD << 0)\
        | (GPIO_PB1_OD << 1)\
        | (GPIO_PB2_OD << 2)\
        | (GPIO_PB3_OD << 3)\
        | (GPIO_PB4_OD << 4)\
        | (GPIO_PB5_OD << 5);\
}*/

#define Gpio_Init() \
{\
    Gpio_INT_Init();\
    PORTA = GPIO_PA_OUT_VALUE;\
    PORTB = GPIO_PB_OUT_VALUE & 0x3F;\
}

// 读PA
#define Gpio_GetPA()            PORTA
#define Gpio_GetPA0()           PA0
#define Gpio_GetPA1()           PA1
#define Gpio_GetPA2()           PA2
#define Gpio_GetPA3()           PA3
#define Gpio_GetPA4()           PA4
#define Gpio_GetPA5()           PA5
#define Gpio_GetPA6()           PA6
#define Gpio_GetPA7()           PA7

// 写PA
#define Gpio_SetPA(u8_data)         PORTA = u8_data
#define Gpio_SetPA0(bit_new_state)  PA0 = bit_new_state
#define Gpio_SetPA1(bit_new_state)  PA1 = bit_new_state
#define Gpio_SetPA2(bit_new_state)  PA2 = bit_new_state
#define Gpio_SetPA3(bit_new_state)  PA3 = bit_new_state
#define Gpio_SetPA4(bit_new_state)  PA4 = bit_new_state
#define Gpio_SetPA5(bit_new_state)  PA5 = bit_new_state
#define Gpio_SetPA6(bit_new_state)  PA6 = bit_new_state
#define Gpio_SetPA7(bit_new_state)  PA7 = bit_new_state

// 读PB
#define Gpio_GetPB()            PORTB
#define Gpio_GetPB0()           PB0
#define Gpio_GetPB1()           PB1
#define Gpio_GetPB2()           PB2
#define Gpio_GetPB3()           PB3
#define Gpio_GetPB4()           PB4
#define Gpio_GetPB5()           PB5

// 写PB
#define Gpio_SetPB(u8_data)         PORTB = u8_data
#define Gpio_SetPB0(bit_new_state)  PB0 = bit_new_state
#define Gpio_SetPB1(bit_new_state)  PB1 = bit_new_state
#define Gpio_SetPB2(bit_new_state)  PB2 = bit_new_state
#define Gpio_SetPB3(bit_new_state)  PB3 = bit_new_state
#define Gpio_SetPB4(bit_new_state)  PB4 = bit_new_state
#define Gpio_SetPB5(bit_new_state)  PB5 = bit_new_state

// 批量设置 PA 方向。0：输出；1：输入（默认）
#define Gpio_SetPADir(u8_data)  IOSTA = u8_data

// 设置 PAx 为输入。
// u8_pin: 管脚编号，如1代表PA1.
#define Gpio_SetPAxInput(u8_pin) IOSTA |= (1 << u8_pin)

// 设置 PAx 为输出。
// u8_pin: 管脚编号，如1代表PA1.
#define Gpio_SetPAxOutput(u8_pin) IOSTA &= ~(1 << u8_pin)

// 批量设置 PB 方向。0：输出；1：输入（默认）
// 建议bit7..6保持0，避免使用PORTB中的GP7..6出问题。
#define Gpio_SetPBDir(u8_data)  IOSTB = u8_data

// 设置 PBx 为输入。
// u8_pin: 管脚编号，如1代表PB1.
#define Gpio_SetPBxInput(u8_pin) IOSTB |= (1 << u8_pin)

// 设置 PBx 为输出。
// u8_pin: 管脚编号，如1代表PB1.
#define Gpio_SetPBxOutput(u8_pin) IOSTB &= ~(1 << u8_pin)


// 批量设置PA上拉电阻。0：开启；1：关闭（默认）
// 注意：bit5设置的是PA5下拉电阻！！！
#define Gpio_SetPAPullUp(u8_data)   APHCON = u8_data

// 设置PA5上拉电阻，0：开启；1：关闭（默认）
#define Gpio_SetPA5PullUp(bit_new_state)    PHPA5 = bit_new_state

// 批量设置PB上拉电阻。0：开启；1：关闭（默认）
#define Gpio_SetPBPullUp(u8_data)       BPHCON = u8_data

// 批量设置PA0~3、PB0~3下拉电阻，0：开启；1：关闭（默认）
// bit0~3控制PA0~3；bit4~7控制PB0~3。
#define Gpio_SetPAPBPullDown(u8_data)         ABPLCON = u8_data


// 设置PB开漏功能。1：开启开漏；0：关闭（默认）
#define Gpio_SetPBOpenDrain(u8_data)       BODCON = u8_data


// 设置 PA 电平变化中断（唤醒）功能。1：开启(MCU默认)；0：关闭(驱动默认)
// 需同时PABIE和GIE为1才会响应中断请求
#define Gpio_SetPAIntCtrl(u8_data)   AWUCON = u8_data

// 设置 PB 电平变化中断（唤醒）功能。1：开启(MCU默认)；0：关闭(驱动默认)
// 需同时PABIE和GIE为1才会响应中断请求
#define Gpio_SetPBIntCtrl(u8_data)   BWUCON = u8_data


// 批量设置PA0~4、PB0~2模拟输入。0：数字IO（默认）；1：模拟输入
// bit0~4控制PA0~4；bit5~7控制PB0~2。
#define Gpio_SetPAPBAnalog(u8_data)         PACON = u8_data

// 设置PB3模拟输入。0：数字IO（默认）；1：模拟输入
#define Gpio_SetPB3Analog(bit_new_state)     PBCON3 = bit_new_state
// 设置PB4模拟输入。0：数字IO（默认）；1：模拟输入
#define Gpio_SetPB4Analog(bit_new_state)     PBCON4 = bit_new_state
// 设置PB5模拟输入。0：数字IO（默认）；1：模拟输入
#define Gpio_SetPB5Analog(bit_new_state)     PBCON5 = bit_new_state



#endif
